package lambda;

import entity.Employee;
import org.junit.Test;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 一、方法引用：Lambda体中的方法已经实现时可以使用“方法引用”
 *
 * 主要有三种语法格式：
 *      对象 :: 实例方法名;
 *      类 :: 静态方法名;
 *      类 :: 实例方法名;
 *
 * 二、构造器引用：
 *
 * 格式：
 *      ClassName :: new;
 *
 * 三、构造器引用：
 *
 * 格式：
 *      Type :: new;
 *
 */
public class LambdaRefTest {

    // 对象 :: 实例方法名
    @Test
    public void lamRefTest1(){
        Consumer<String> con = System.out::println;
        con.accept("Lambda println");
    }

    @Test
    public void lamRefTest2(){
        Employee employee = new Employee();
        Supplier<Integer> sup = employee::getAge;
        System.out.println(sup.get());
    }

    // 类 :: 静态方法名
    @Test
    public void lamRefTest3(){
        Comparator<Integer> comp = Integer::compare;
        System.out.println(comp.compare(1000, 1001));
    }

    // 类 :: 实例方法名
    @Test
    public void lamRefTest4(){
        BiPredicate<String, String> biPre = String::equals;
        System.out.println(biPre.test("你好", "Hello"));
    }

    // 构造器引用
    @Test
    public void lamRefTest5(){
        Function<Long, Employee> func = Employee::new;
        Employee e = func.apply(10217368271L);
        System.out.println(e.getId());
    }

    // 数组引用
    @Test
    public void lamRefTest6(){
        //Function<Integer, String[]> func = (x) -> new String[x];
        Function<Integer, String[]> func = String[]::new;
        String[] strings = func.apply(10);
        System.out.println(strings.length);
    }
}
